// 数字计算方法
import {
	Decimal
} from 'decimal.js';

/**
 * 加法
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {string} - 返回结果为字符串
 */
export function add(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return (new Decimal(a).add(new Decimal(b))).toString()
}

/**
 * 减法
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {string} - 返回结果为字符串
 */
export function sub(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return (new Decimal(a).sub(new Decimal(b))).toString()
}

/**
 * 乘法
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {string} - 返回结果为字符串
 */
export function mul(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return (new Decimal(a).mul(new Decimal(b))).toString()
}

/**
 * 除法
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @param {number} fixed - 保留小数位数，默认4
 * @returns {string} - 返回结果为字符串
 */
export function div(a, b, fixed = 4) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	let result = new Decimal(a).div(new Decimal(b))
	const roundedResult = result.toDecimalPlaces(fixed, Decimal.ROUND_HALF_UP);
	return roundedResult.toString()
}

/**
 * 求余
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {string} - 返回结果为字符串
 */
export function mod(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return (new Decimal(a).modulo(new Decimal(b))).toString()
}

/**
 * 判断 是否相等
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {boolean} - 返回结果为boolean
 */
export function eq(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return new Decimal(a).equals(new Decimal(b))
}

/**
 * 判断 是否大于
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {boolean} - 返回结果为boolean
 */
export function gt(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return new Decimal(a).greaterThan(new Decimal(b))
}

/**
 * 判断 是否大于、等于
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {boolean} - 返回结果为boolean
 */
export function gteq(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return new Decimal(a).greaterThanOrEqualTo(new Decimal(b))
}

/**
 * 判断 是否小于
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {boolean} - 返回结果为boolean
 */
export function lt(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return new Decimal(a).lessThan(new Decimal(b))
}

/**
 * 判断 是否小于、等于
 * @param {number | string} a - 第一个数
 * @param {number | string} b - 第二个数
 * @returns {boolean} - 返回结果为boolean
 */
export function lteq(a, b) {
	if (typeof a == Number) {
		a = a.toString();
	}
	if (typeof b == Number) {
		b = b.toString();
	}
	return new Decimal(a).lessThanOrEqualTo(new Decimal(b))
}

/**
 * 取反
 * @param {number | string} a - 第一个数
 * @returns {string} - 返回结果为字符串
 */
export function negate(a) {
	return sub("0", a)
}